﻿using System;
using System.Data;
using System.Collections;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using NHibernate;
using NHibernate.Cfg;
using System.Text.RegularExpressions;
using System.Collections.Generic;

/// <summary>
/// Summary description for UsuarioControl
/// </summary>

public class UsuarioControl
{
	public UsuarioControl()
	{
		//
		// TODO: Add constructor logic here
		//
	}

    public global::Usuario Usuario
    {
        get
        {
            throw new System.NotImplementedException();
        }
        set
        {
        }
    }

    // <summary>
    //Metodo que se encarga de ingresar en la BD los datos correspondiente a un usuario
    //parametros de entrada tipo de dato usuario. 
    // </summary>

   
    public virtual bool Guardar(Usuario nuevoUsuario)
    {
        bool resultado = false;
        ITransaction tx = null;    
        ISession session = NHibernateControl.GetCurrentSession();

        try
        {
            tx = session.BeginTransaction();
            session.Save(nuevoUsuario);
            tx.Commit();
        }
        catch (HibernateException e)
        {
            Console.Write(e.Message);
            tx.Rollback();
        }

        resultado = true;
        session.Close();
        NHibernateControl.CloseSessionFactory();

        return resultado;
    }

    private IList GetUsuarios()
    {
        IList usuarios = null;

        ISession session = NHibernateControl.GetCurrentSession();
        try
        {
            ITransaction tx = session.BeginTransaction();
            usuarios = session.CreateCriteria(typeof(Usuario)).List();
            session.Flush();
            NHibernateControl.CloseSession();
        }
        catch (NHibernate.TransactionException a)
        {
            Console.Write(a.Message);
        }



        return usuarios;
    }

    public Usuario Consultar(int id)
    {
        IList usuarios = this.GetUsuarios();
        Usuario usuario = new Usuario();

        foreach (Usuario usuarioGuardado in usuarios)
        {
            if (usuarioGuardado.Id == id)
                usuario = usuarioGuardado;
        }

        return usuario;
    }

    /// <summary>
    /// Busca todas las facturas por cada campo segun lo ingresado por pantalla
    /// </summary>
    /// <param name="query">string ingresado</param>
    /// <returns>IList de facturas</returns>
    public IList Buscar(String query)
    {

        IList usuarios = this.GetUsuarios();
        IList resultado = new ArrayList();
        
        foreach (Usuario usuario in usuarios)
        {
            if (usuario.Status == 1)
            {
                if (Regex.IsMatch(usuario.Nombre.ToLower(), "^" + query))
                    resultado.Add(usuario);
                else if (Regex.IsMatch(usuario.Apellido.ToLower(), "^" + query))
                    resultado.Add(usuario);
                else if (Regex.IsMatch(usuario.Login.ToLower(), "^" + query))
                    resultado.Add(usuario);
                else if (Regex.IsMatch(usuario.Password.ToLower(), "^" + query))
                    resultado.Add(usuario);
                else if (Regex.IsMatch(usuario.Tipo.ToLower(), "^" + query))
                    resultado.Add(usuario);
            }
        }
        return resultado;
    }

    public bool Eliminar(int id)
    {
        IList usuarios = this.GetUsuarios();
        Usuario usuario = new Usuario();

        foreach (Usuario usuarioGuardado in usuarios)
        {
            if (usuarioGuardado.Id == id)
            {
                usuarioGuardado.Status = 0;
                usuario = usuarioGuardado;
            }
        }

        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction tx = session.BeginTransaction();

        session.Update(usuario);

        tx.Commit();
        NHibernateControl.CloseSession();

        return true;
    }

    /// <summary>
    /// modificarUsuario
    ///  Este método esta encargado de modificar los datos de un usuario, 
    ///  este metodo esta sobrecargado 
    /// </summary>
    ///
    /// <param name="id"> 
    ///     Parámetro de tipo entero, contiene la clave 
    ///     primaria de un registro almacenado en la base de datos, 
    ///     será utilizado para buscar un registro en la base de datos.
    /// </param>
    /// <param name="nombre">   
    ///     Parámetro de tipo string que contiene el nuevo nombre que va 
    ///     a poseer el usuario a modificar.
    /// </param>
    /// <param name="apellido">   
    ///     Parámetro de tipo string que contiene el nuevo apellido que va 
    ///     a poseer el usuario a modificar.
    /// </param>
    /// <param name="tipo">   
    ///     Parámetro de tipo string que contiene el nuevo tipo de usuario 
    ///     que va a poseer el usuario a modificar.
    /// </param>
    /// <param name="status">   
    ///     Parámetro de tipo string que contiene el nuevo estatus que va 
    ///     a poseer el usuario a modificar.
    /// </param>
    /// 
    ///
    /// <returns> Este método no retorna un valor </returns>
    ///
    /// <pre> 
    ///     Para ejecutar este método el usuario debe estar visualizando 
    ///     el formulario Modificar Datos Usuario y  presionar el boton procesar. 
    /// </pre>
    ///
    /// <pos> 
    ///      Una vez ejecutado el metodo los campos nombre, apellido, tipo, status dentro el registro 
    ///      modificado deben haber cambiado de su valor previo a los parametros de 
    ///      entrada del metodo.  
    /// </pos>
    public void modificarUsuario(int id, string nombre, string apellido, string tipo, Int32 status)
    {
        Usuario _Usuario;
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction transaction = null;
        try
        {
            session = NHibernateControl.GetCurrentSession();
            _Usuario = (Usuario)session.Load(typeof(Usuario), id);
            transaction = session.BeginTransaction();
            _Usuario.Nombre = nombre;
            _Usuario.Apellido = apellido;
            _Usuario.Tipo = tipo;
            _Usuario.Status = status;
            session.Update(_Usuario);
            session.Flush();
            transaction.Commit();
        }
        catch (HibernateException excp)
        {
            if (transaction != null)
                transaction.Rollback();
            session.Clear();
            throw excp;
        }
    }

    /// <summary>
    /// modificarUsuario
    /// Este método esta encargado de modificar el password de un usuario,
    /// este metodo esta sobrecargado 
    /// </summary>
    ///
    /// <param name="id"> 
    ///     Parámetro de tipo entero, contiene la clave 
    ///     primaria de un registro almacenado en la base de datos, 
    ///     será utilizado para buscar un registro en la base de datos.
    /// </param>
    /// <param name="password">   
    ///     Parámetro de tipo string que contiene el nuevo password que va 
    ///     a poseer el usuario a modificar.
    /// 
    ///
    /// <returns> Este método no retorna un valor </returns>
    ///
    /// <pre> 
    ///     Para ejecutar este método el usuario debe estar visualizando 
    ///     el formulario Modificar Password Usuario y  
    ///     presionar el boton procesar. 
    /// </pre>
    ///
    /// <pos> 
    ///    Una vez ejecutado el metodo el campo password dentro el registro 
    ///    modificado debe haber cambiado de su valor previo a del parametro de 
    ///    entrada del metodo.  
    /// </pos>
    public void modificarUsuario(int id, string password)
    {
        Usuario _Usuario;
        ISession session = NHibernateControl.GetCurrentSession();
        ITransaction transaction = null;

        try
        {
            session = NHibernateControl.GetCurrentSession();
            _Usuario = (Usuario)session.Load(typeof(Usuario), id);
            transaction = session.BeginTransaction();
            _Usuario.Password = password;
            session.Update(_Usuario);
            session.Flush();
            transaction.Commit();
        }
        catch (HibernateException excp)
        {
            if (transaction != null)
                transaction.Rollback();
            session.Clear();
            throw excp;
        }
    }
}
